iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 21
0
自我挑戰組

機器學習應用練習系列 第 21

特徵調整

  • 分享至 

  • xImage
  •  

特徵調整

原本今天想開始練習情感分析,讀了很多相關文章和snownlp庫

覺得情感分析原理好像和文章分類方法類似,首先要有標註正面和負面的語料庫,才可以開始進行

情感語料庫覺得中文滿不好找的,snownlp中有內建分辨pos,neg的語料庫

snownlp說明有提到這份語料庫是蒐集購物評論,所以當出現"很貴","實用"等單字就看得出效果

不過我測試一些簡單句子"小明很沮喪"就幾乎沒辨識力了

所以關鍵還是在語料庫

於是我又回來繼續調整昨天的模型

看利用其他學過的方法是否能再提高精確度

  • 雙連字
    先挑出每種標籤的高頻雙連字出來,發先多了許多明顯的特徵
>>> print(lab_Ftwowords['科技'])
['日綜合外電',
 '外電報導',
 '臉書',
 'iPadPro',
 'iPhoneXS',
 '搭載',
 '朱則瑋',
 '則瑋台北',
 '新款iPad',
 '比特幣',
 '蘋果公司',
 'XSMax',
 '科技網站',
 '報導蘋果',
 'MacBookAir',
 '創新',
>>> print(lab_Ftwowords['產經'])
['億美元',
 '新台幣',
 '億元',
 '福建晉華',
 '洗錢防制',
 '商業機密',
 '兌美元',
 '金融機構',
 '中華電信',
 '新南向',
 '公升元',
 '外電報導',
 '中貿易戰',
 '台幣兌',
 '美光商業',
 '防制洗錢',
 '限制競爭',

再把這些類別高頻字整理在一起,由於要拿來做特徵提取,所以這動作不能有標籤

All_Ftwowords=[]
for n in lab_Ftwowords.values():
    for m in n:
        All_Ftwowords.append(m)
>>> print(All_Ftwowords)
['新台幣',
 '李明彥',
 '賴香伶',
 '陳慶男',
 '台幣元',
 '法律扶助',
 '新聞稿',
 '台幣萬元',
 '陳姓樁',
 '姓樁腳',
 '請羈押禁',
 '億元',
 '台北地檢署',
 '南投縣',

最後在特徵提取器中也增加找出雙連字的動作,並且判斷是否出現在剛做出來的All_Ftwowords中做為特徵

def pos_features(article,top):
    features={}
    t = ''
    seg_list = jieba.cut(article, cut_all=False)
    t = ",".join(seg_list)
    article_tokens = t.split(',')
    article_tokens = [w for w in article_tokens if w.isalpha()]

    filt_tokens = list(filter(lambda a: a not in stopwords and a not in filterwords , article_tokens))#and len(a)>1, article_tokens))
    ###
    twowords = list(nltk.bigrams(article_tokens))
    two = nltk.FreqDist(twowords).most_common(int(top/2))
    Ftwowords = [i[0]+i[1] for i,j in two]
    for two in Ftwowords:
        features[two] = two in All_Ftwowords
    ###
    toks = [w[0] for w in nltk.FreqDist(filt_tokens).most_common(top)]
#   print(toks)
    for tok in toks:
#            features[tok] = tok in [i[0] for i in lab_fwords[labname]]
        features[tok] = True
    return features

調整好特徵提取器,在執行一遍程式就能做出新的特徵集,就能拿去練模型了

>>> size = int(len(featuresets)*0.7)
>>> train_set, test_set = featuresets[:size], featuresets[size:]
>>> classifier = nltk.NaiveBayesClassifier.train(train_set)
>>> print(nltk.classify.accuracy(classifier, test_set))

0.7944444444444444

結果精確度比昨天低了5%,我覺得是雙連詞中有類似停止詞的字沒有篩出來,還有高頻字與雙連詞拿來做特徵的比例可能也有影響


上一篇
中文文本分類練習
下一篇
練習提高精確度
系列文
機器學習應用練習30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言